<?php
// 应用公共文件
use think\facade\Config;
use think\wenhainan\Auth;


/**
 * 验证当前登陆admin的权限
 * @param $rule
 * @return bool
 * 验证admin权限
 */
function checkAuth($rule): bool
{

    // 获取当前用户
    $adminSer = \app\admin\service\auth\AdminService::instance();
    $adminId = $adminSer->getLoginId();

    // 超级管理员不验证权限
    $super = Config::get('app.super_admin');
    if($super == $adminId){
        return true;
    }

    // 验证权限
    $auth = Auth::instance();
    // check中会将所有字母转为小写
    return $auth->check($rule, $adminId);
}

/**
 * 反序列化函数
 * 解决中文反序列化报错的问题
 * @param $str
 * @return array|string|string[]|null
 */
function miUnserialize($str)
{
    $str = preg_replace_callback('#s:(\d+):"(.*?)";#s', function ($match) {
        return 's:' . strlen($match[2]) . ':"' . $match[2] . '";';
    }, $str);
    return unserialize($str);
}

/**
 * 向指定内容的多媒体路径中添加当前域名
 * @param string $data
 * @return array|string|null
 */
function addDomain($data): array|string|null
{
    if ($data){
        $domain = request()->domain();
        return preg_replace('/(<img.+?src=")(\/uploads)/','$1'.$domain.'$2', $data);
    }else{
        return $data;
    }

}

/**
 * @param $rel
 * @param $name
 * @return mixed|string
 * 获取关联模型中的字段
 */
function getRelValue($rel, $name){
    if ($rel){
        return $rel->getAttr($name);
    }else{
        return '';
    }
}

/**
 * 生成唯一字符串
 * @param $prefix 前缀
 * @return false|string
 */
function uuid($prefix=''){
//    return strtoupper(substr(md5(uniqid(md5(microtime(true)),true)),8,16));
    return session_create_id($prefix);
}

function makeOrderNo($prefix=''){
//生成24位唯一订单号码，格式：YYYY-MMDD-HHII-SS-NNNN,NNNN-CC，
//其中：YYYY=年份，MM=月份，DD=日期，HH=24格式小时，II=分，SS=秒，NNNNNNNN=随机数，CC=检查码
//订单号码主体（YYYYMMDDHHIISSNNNNNNNN）
    $order_id_main = date('YmdHis') . rand(10000000,99999999);
//订单号码主体长度
    $order_id_len = strlen($order_id_main);
    $order_id_sum = 0;
    for($i=0; $i<$order_id_len; $i++){
        $order_id_sum += (int)(substr($order_id_main,$i,1));
    }
//唯一订单号码（YYYYMMDDHHIISSNNNNNNNNCC）
    $order_id = $order_id_main . str_pad((100 - $order_id_sum % 100) % 100,2,'0',STR_PAD_LEFT);
    return $prefix.$order_id;
}


/**
 * @param $value
 * @param string $sep
 * @return string
 *
 * 自定义把数组元素组合为字符串的方法
 *
 */
function miImplode (array|string $value, string $sep = ','): string
{

    if (!$value){
        return '';
    }else if (is_array($value)){
        return implode($sep, $value)?:'';
    }else{
        return $value;
    }
}

/**
 * @param string|array|null $value
 * @param string $sep
 * @return array
 */
function miExplode (string|null|array $value, string $sep = ','): array
{

    $arr = explode($sep, $value);
    if ($arr){
        $arr = array_filter($arr);
    }else{
        $arr = [];
    }

    return $arr;

}



/**
 * 生成成功的信息
 * @param $param
 * @return array|string
 */
function makeSuccessResult($param = "操作成功"){

    $data = [
        'error' => 0,
        'msg' => '操作成功',
    ];

    if (is_array($param)) {
        // 合并数组
        $data = array_merge($data, $param);
        $data['error'] = 0;
    }else{
        $data['msg'] = $param;
    }

    return $data;
}

/**
 * @param string $param
 * @param int $error
 * @return array|string
 */
function makeErrorResult(string $param = "操作失败", int $error=1): array|string
{

    $data = [
        'error' => $error,
        'msg' => '操作失败',
    ];

    if (is_array($param)) {
        // 合并数组
        $data = $data + $param;
    }else{
        $data['msg'] = $param;
    }
    $data['error'] = ($data['error']??0)? 1 : $data['error'];

    return $data;
}

function jsonSuccess($param = '操作成功'): \think\response\Json
{

    return json(makeSuccessResult($param));
}

function jsonError($param = "操作失败", $error=1): \think\response\Json
{
    return json(makeErrorResult($param, $error));
}


/**
 * 将获取的服务器信息中的中文编码转为utf-8
 * @access protected
 * @param $data array
 * @return array                 转化后的数组
 */
function changeToUtf8(array $data): array
{
    foreach ($data as $key => $value) {
        //mb_convert_encoding第一个参数只能接受array|string需要先转换否则float等类型会报错
        if (!is_array($value) && !is_string($value)){
            $value = strval($value);
        }
        $data[$key] =  mb_convert_encoding($value, "UTF-8","ASCII,UTF-8,GBK,GB2312");
    }
    return $data;
}

/***
 * 随机获取系统头像
 * @return string
 */
function getAvatar(): string
{
    $arr = [
        '/static/sys_avatar/Avatar-12_96.png',
        '/static/sys_avatar/Avatar-13_96.png',
        '/static/sys_avatar/Avatar-14_96.png',
        '/static/sys_avatar/Avatar-21_96.png',
        '/static/sys_avatar/Avatar-26_96.png',
        '/static/sys_avatar/Avatar-27_96.png',
        '/static/sys_avatar/Avatar-28_96.png',
        '/static/sys_avatar/Avatar-36_96.png',
    ];
    $index = rand(0,7);

    return $arr[$index];
}

// 随机生成昵称
function getNickname(): string
{
    // 密码字符集，可任意添加你需要的字符
    $chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
    $str = '';
    for($i = 0; $i < 6; $i++) {
        // 这里提供两种字符获取方式
        // 第一种是使用 substr 截取$chars中的任意一位字符；
        // 第二种是取字符数组 $chars 的任意元素
        $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
//            $str .= $chars[mt_rand(0, strlen($chars) - 1)];
    }
    return $str;
}
